Obsidian 全タスクソート
次のバージョン: Obsidian 実行中タスク選択4
次のバージョンでは、時刻つきの場合はセクションを跨いでソート、時刻なしの場合はもとのセクションの末尾に移動に変更
規定のフォーマットになっていることを前提にした時刻ログのソート処理です。時刻昇順でソートします。
デイリーノートのフォーマット
### 🗂️セクション名(セクションの開始時刻をhh:mm形式で入れる) で時刻ログ(並び替え対象)と日記部分(並び替え対象外)を分ける
### 🗂️セクション名 以降は、すべてタイムログが入っている想定。
メモの場合も必ず時刻を打刻する。
一行ずつ必ず時刻を打刻する。
code:txt
<< 2024-09-28 | 2024-09-30 >>
<< 2024-09-22 | 2024-10-06 >>
<< 2024-08-29 | 2024-10-29 >>
<< 2023-09-29 | 2025-09-29 >>
#journal
- ルーチンコピーやめて、リアルタイムロギングベースにしてみた。いい感じ。
- ここにコメントを入れる
### 🗂️04:00
- x 08:45-08:45 0\ ☀️おはよう
- 08:46 よく寝た
スクリプトの流れ
### 🗂️を検索: ノート内で### 🗂️というセクションを探し、その次の行からすべての行を対象に処理します。
行の分類: 各行に対して、hh:mm形式の時刻を持つかどうかを判定し、時刻がある行とない行に分けます。
時刻を持つ行のソート: hh:mm形式の時刻を抽出し、時刻順にソートします。
時刻がない行の処理: 時刻のない行はソート済みの行の後に配置します。
内容の更新: ### 🗂️行までの内容は変更せず、それ以降の行を処理して結合し、エディタに反映します。
これで、### 🗂️の行の次からすべての行が処理され、時刻がない行はソートされた時刻付きの行の後ろに移動します。
スクリプト
code:js
<%*
// Obsidianで### 🗂️より下のすべての行を処理して、時刻順にソートするスクリプト
async function sortTasksByTime() {
const activeLeaf = app.workspace.activeLeaf;
if (!activeLeaf) {
new Notice('エディターがアクティブではありません');
return;
}
const editor = activeLeaf.view.editor;
if (!editor) {
new Notice('エディタが見つかりません');
return;
}
// エディタの内容を取得
const content = editor.getValue();
// ### 🗂️というセクションを探し、その次の行からソート対象にする
const folderIndex = content.indexOf('### 🗂️');
if (folderIndex === -1) {
new Notice('### 🗂️ セクションが見つかりません');
return;
}
// ### 🗂️の次の行を探す
const lines = content.split('\n');
let sortStartIndex = -1;
for (let i = 0; i < lines.length; i++) {
if (linesi.startsWith('### 🗂️')) {
sortStartIndex = i + 1;
break;
}
}
if (sortStartIndex === -1 || sortStartIndex >= lines.length) {
new Notice('ソート対象の行が見つかりません');
return;
}
// ### 🗂️の次の行からすべての行を取得
const linesToSort = lines.slice(sortStartIndex);
// 時刻を持つ行と持たない行に分ける
const linesWithTime = [];
const linesWithoutTime = [];
linesToSort.forEach(line => {
const timeMatch = line.match(/\b\d{2}:\d{2}\b/);
if (timeMatch) {
linesWithTime.push({ line, time: timeMatch0 });
} else {
linesWithoutTime.push(line);
}
});
// 時刻を持つ行を時刻順にソートする
const sortedLinesWithTime = linesWithTime.sort((a, b) => {
return a.time.localeCompare(b.time);
}).map(item => item.line);
// ### 🗂️より上の部分とその行までをそのまま保持
const beforeFolderContent = lines.slice(0, sortStartIndex);
// ソートされた時刻付きの行と時刻のない行を結合
const newContent = [
...beforeFolderContent,
...sortedLinesWithTime,
...linesWithoutTime
].join('\n');
// 新しい内容をエディタに設定
editor.setValue(newContent);
new Notice('すべての行を時刻順にソートしました');
}
sortTasksByTime();
%>